/*
 * CVisualisator.h
 *
 *  Created on: 04.09.2011
 *      Author: Blinov Kirill
 *      Copyright: LGPL
 */

#ifndef CVISUALISATOR_H_
#define CVISUALISATOR_H_

#include "../TThreadSafeQueue.h"
#include "../BasicTypes.h"
#include "CCameraPreprocessor.h"
#include "CRenderer.h"
#include "CFrameBuffer.h"
#include "ShaderTypes.h"
#include <vector>
//#include "Manager Resource/ManagerResource.h"

/*
 *
 */
class CVisualisator
{
private:
	CShaderProgramm*     Programms[SHADER_TYPE_MAX];
	bool                 initialized;
	CCameraPreprocessor* cameraPreprocessor;
	CRenderer*           renderer;

protected:
	GLuint LoadShader( const std::string FileName, const GLenum ShaderType, std::string** ShaderSource );
	bool CheckShader( const GLuint ShaderName, const char* Source );
	bool CheckProgram(GLuint ProgramName);
	std::string* LoadFile( const std::string& Filename );
public:
	CVisualisator();
	virtual ~CVisualisator();

	bool StartVisualisation( TThreadSafeQueue<FULL_FRAME_DATA*>* FrameQueue, TThreadSafeQueue<INPUT_MESSAGE*> *InputMessageQueue );
	void StopVisualisation();
	void ConfigVisualisation( );
	void SetDimension( const SCREEN_DIMENSION &ScreenDimension );

	GLuint SetUpModels( const std::vector<PURE_COMPRESSED_MODEL> &ProcessedModels ); //TODO Вынести всю эту загрузку в отдельный файл
    GLuint SetUpShader( const std::string FileName );//TODO Вынести всю эту загрузку в отдельный файл
    bool LinkShaderProgramm( const GLuint VertexShaderName, const GLuint PixelShaderName, const SHADER_TYPES Type );
    void DeleteTexture( const GLuint Name );//TODO Вынести всю эту загрузку в отдельный файл
    void DeleteTexture( const std::vector<GLuint> Names );//TODO Вынести всю эту загрузку в отдельный файл
    void DeleteProgramm( const SHADER_TYPES Type );//TODO Вынести всю эту загрузку в отдельный файл
    void DeleteVertexBuffer( const GLuint Name );//TODO Вынести всю эту загрузку в отдельный файл
    void DeleteVertexBuffer( const std::vector<GLuint> Name );
};

#endif /* CVISUALISATOR_H_ */
